home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / fpu881 / src6.zoo / fputc.c < prev    next >
C/C++ Source or Header  |  1991-09-24  |  1KB  |  57 lines

  1. /* from Dale Schumacher's dLibs */
  2.  
  3. #include <stdio.h>
  4. #include <unixlib.h>
  5.  
  6. #ifndef TRUE
  7. #define TRUE  1
  8. #define FALSE 0
  9. #endif
  10.  
  11. int fputc(c, fp)
  12.         register int c;
  13.     register FILE *fp;
  14.     {
  15.     register int nl = FALSE;
  16.     register long m;
  17.     unsigned int f = fp->_flag;
  18.  
  19.     if(f & _IORW)
  20.     {
  21.         fp->_flag |= _IOWRT;
  22.         f = (fp->_flag &= ~(_IOREAD | _IOEOF));
  23.     }
  24.     if(!(f & _IOWRT)            /* not opened for write? */
  25.     || (f & (_IOERR | _IOEOF)))        /* error/eof conditions? */
  26.         return(EOF);
  27. #if 0
  28.     if(fp->_base == NULL)    /* allocate a buffer if there wasn't one */
  29.         _getbuf(fp);
  30. #endif
  31.     if(!(f & _IOBIN) && (c == '\n'))    /* NL -> CR+LF ? */
  32.         {
  33.         c = '\r';
  34.         nl = TRUE;
  35.         }
  36. _fputc:
  37.     *(fp->_ptr)++ = c; fp->_cnt++;
  38.     if( (fp->_cnt >= fp->_bsiz) || 
  39.         ((f & _IOLBF) && (c == '\n'))  ) /* flush line buffd stream on \n */
  40.         {
  41.         m = fp->_cnt;
  42.         fp->_cnt = 0;
  43.         fp->_ptr = fp->_base;
  44.         if(lwrite(fp->_file, fp->_base, m) != m)
  45.             {
  46.             fp->_flag |= _IOERR;
  47.             return(EOF);
  48.             }
  49.         }
  50.     if(nl && (c == '\r'))            /* NL -> CR+LF ? */
  51.         {
  52.         c = '\n';
  53.         goto _fputc;
  54.         }
  55.     return(c);
  56.     }
  57.